package com.zm.blog.vo;

import com.fasterxml.jackson.annotation.JsonFormat;
import com.zm.blog.entity.Label;
import com.zm.blog.entity.Sort;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.time.LocalDateTime;

/**
 * @Author: Sister Xiao Ming
 * @Description:  ArticleVO 类，这是一个用于文章展示的值对象（View Object），包含了文章的核心属性和需要关联查询的扩展属性
 */
@Data
public class ArticleVO {

    // 文章ID
    private Integer id;

    // 作者ID
    private Integer userId;

    // 封面图（为空时随机选择）
    private String articleCover;

    // 文章标题（非空校验）
    @NotBlank(message = "文章标题不能为空")
    private String articleTitle;

    // 文章内容（非空校验）
    @NotBlank(message = "文章内容不能为空")
    private String articleContent;

    /**
     * 互动数据
     */
    private Integer viewCount;            // 浏览数

    private Integer likeCount;            // 点赞数

    private Integer commentCount;         // 评论数（需查询封装）

    /**
     * 状态控制
     */
    private Boolean commentStatus;       // 评论开关

    private Boolean recommendStatus;     // 推荐状态

    private Boolean viewStatus;          // 可见状态

    private String password;             // 访问密码

    /**
     * 多媒体扩展
     */
    private String videoUrl;             // 视频地址

    private Boolean hasVideo = false;    // 是否有视频（根据videoUrl自动计算）

    private String tips;                 // 文章提示信息

    /**
     * 时间信息
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;  // 创建时间（JSON格式化）

    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;  //更新时间

    private String updateBy;              // 更新人

    /**
     * 作者信息
     */
    private String username;             // 作者名（需查询封装）

    /**
     * 分类与标签
     */
    @NotNull(message = "文章分类不能为空")
    private Integer sortId;

    @NotNull(message = "文章标签不能为空")
    private Integer labelId;

    private Sort sort;                   // 分类对象（需查询封装）

    private Label label;                 // 标签对象（需查询封装）

}
